package in.rob.client.base;
import in.lib.Constants;
import in.lib.Debug;
import in.lib.adapter.PhonePageAdapter;
import in.lib.annotation.InjectView;
import in.lib.manager.SettingsManager;
import in.lib.manager.UserManager;
import in.lib.utils.Dimension;
import in.lib.utils.Views;
import in.rob.client.AuthenticateActivity;
import in.rob.client.MainApplication;
import in.rob.client.R;
import in.rob.client.SearchActivity;
import in.rob.client.navigation.NavigationFragment;
import in.rob.client.page.base.StreamFragment;
import java.util.Locale;
import lombok.Getter;
import lombok.Setter;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import com.google.analytics.tracking.android.EasyTracker;
import com.slidingmenu.lib.SlidingMenu;
import com.slidingmenu.lib.app.SlidingFragmentActivity;
public abstract class RobinSlidingActivity extends SlidingFragmentActivity implements OnClickListener, SensorEventListener
{
@Getter @InjectView(R.id.pager) public ViewPager viewPager;
@Getter private Context context;
@Getter private NavigationFragment leftNavigation;
@Getter @Setter private PhonePageAdapter adapter;
protected boolean handledLongPress = false;
private int pagerIndex = 0;
private SensorManager sensorManager;
private final int SHAKE_THRESHOLD = 25;
private final int SHAKE_COUNT = 2;
private long lastUpdate = 0L;
private int mShakeCount = 0;
private float mAccel = 0.00f;
private float mAccelCurrent = SensorManager.GRAVITY_EARTH;
private float mAccelLast = SensorManager.GRAVITY_EARTH;
public static final int SLIDING_MENU_PORTRAIT_WIDTH = 100;
public static final int SLIDING_MENU_LANDSACPE_WIDTH = 70;
/**
* Initializes the custom action bar
* @param ctx
*/
protected static void initActionBar(final RobinSlidingActivity ctx)
{
ctx.getSupportActionBar().setCustomView(R.layout.action_bar);
ctx.getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
ctx.getSupportActionBar().setDisplayShowCustomEnabled(true);
ctx.getSupportActionBar().setDisplayShowHomeEnabled(false);
ctx.getSupportActionBar().setDisplayHomeAsUpEnabled(false);
ctx.getSupportActionBar().setHomeButtonEnabled(false);
ctx.getSupportActionBar().setDisplayUseLogoEnabled(false);
// sliding menu custom toggle
View upBtn = ctx.getSupportActionBar().getCustomView().findViewById(R.id.up_button);
upBtn.setOnClickListener(ctx);
}
@Override public void setTitle(CharSequence title)
{
getAdapter().setTitle(title.toString());
}
public void setTitle2(CharSequence title)
{
getAdapter().setTitle2(title.toString());
}
@Override public void onCreate(Bundle arg0)
{
super.onCreate(arg0);
setLocale();
setStyle();
this.context = this;
this.sensorManager = (SensorManager)getContext().getSystemService(Context.SENSOR_SERVICE);
RobinSlidingActivity.initActionBar(this);
if (!UserManager.isLoggedIn())
{
Intent login = new Intent(this, AuthenticateActivity.class);
login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
login.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
login.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(login);
finish();
return;
}
retrieveArguments(arg0 == null ? getIntent().getExtras() : arg0);
setContentView(R.layout.sliding_view);
Views.inject(this);
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE
&& (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE))
{
setLeftNavigationContentForTablet();
setupForTablet();
}
else
{
setBehindLeftContentView(R.layout.navigation_fragment);
setupForPhone();
}
leftNavigation = (NavigationFragment)getSupportFragmentManager().findFragmentById(R.id.frame);
if (arg0 != null && getAdapter() != null)
{
pagerIndex = arg0.getInt("view_pager_index", 0);
getAdapter().setIndex(pagerIndex);
}
}
public void setLeftNavigationContentForTablet()
{
setBehindLeftContentView(new View(this), new LayoutParams(0, LayoutParams.MATCH_PARENT));
}
@Override public void onPostCreate(Bundle savedInstanceState)
{
super.onPostCreate(savedInstanceState);
Debug.logHeap(getClass());
}
/**
* Sets up the basic layouts for tablets by disabling sliding menu.
* {@link setup(false)} is called directly after this method.
*/
public void setupForTablet()
{
getSlidingMenu().setSlidingEnabled(false);
setup(false);
}
/**
* Sets up the basic layouts for the sliding menu and listeners for phone
* devices. {@link setup(true)} is called <b>before</b> the page change
* listener is for the adapter.
*/
public void setupForPhone()
{
// Calculate the size for the sliding menu
Dimension dimension = new Dimension(this);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
getSlidingMenu().setBehindWidth((int)dimension.getWidthFromRatio(SLIDING_MENU_PORTRAIT_WIDTH), SlidingMenu.LEFT);
}
else
{
getSlidingMenu().setBehindWidth((int)dimension.getWidthFromRatio(SLIDING_MENU_LANDSACPE_WIDTH), SlidingMenu.LEFT);
}
setup(true);
getSlidingMenu().setBehindScrollScale(0.2f, SlidingMenu.BOTH);
getAdapter().setOnPageChangeListener(new OnPageChangeListener()
{
@Override public void onPageSelected(int index)
{
if (index == 0)
{
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}
else
{
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
}
}
@Override public void onPageScrolled(int arg0, float arg1, int arg2){}
@Override public void onPageScrollStateChanged(int arg0){}
});
if (getAdapter().getIndex() == 0)
{
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}
else
{
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
}
}
/**
* Called after either setupTablet() or setupPhone() to finish the activity
* setup. Here, you should inflate your page adapter with the relevant pages.
*
* @param isPhone If the device is a phone, this will be true.
*/
public abstract void setup(boolean isPhone);
/**
* Sets the style of the activity based on the current set style in user
* settings. Override this to prevent or supply your own styles to set.
*/
public void setStyle()
{
String styleName = SettingsManager.getThemeName();
int styleRes = getResources().getIdentifier(styleName, "style", getPackageName());
try
{
setTheme(styleRes);
}
catch (Exception e)
{
setTheme(R.style.DefaultLight);
}
}
public void setLocale()
{
String languageToLoad = SettingsManager.getLocale();
if (TextUtils.isEmpty(languageToLoad))
{
languageToLoad = getSharedPreferences(getPackageName(), Context.MODE_PRIVATE).getString(Constants.PREFS_DEFAULT_LOCALE, "en");
}
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
/**
* Gets the current fragment in the page adapter
* @return The current shown fragment in the adapter.
*/
public Fragment getCurrentFragment()
{
return adapter.getCurrentFragment();
}
@Override public void onAccuracyChanged(Sensor sensor, int accuracy){}
@Override public void onSensorChanged(SensorEvent event)
{
long curTime = System.currentTimeMillis();
if ((curTime - lastUpdate) > 150 && SettingsManager.isShakeRefreshEnabled())
{
lastUpdate = curTime;
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float)Math.sqrt((x * x + y * y + z * z));
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta;
if (mAccel > SHAKE_THRESHOLD)
{
if (++mShakeCount >= SHAKE_COUNT
&& getCurrentFragment() != null
&& getCurrentFragment() instanceof StreamFragment
&& !((StreamFragment)getCurrentFragment()).isLoading())
{
((StreamFragment)getCurrentFragment()).onForceRefresh();
}
}
}
}
@Override public boolean onOptionsItemSelected(MenuItem item)
{
for (int index = 0, count = getAdapter().getCount(); index < count; index++)
{
Fragment f = (getAdapter().getItemAt(index));
if (f != null && f instanceof RobinListFragment)
{
boolean result = ((RobinListFragment)f).onOptionsItemSelected(item);
if (result)
{
return true;
}
}
}
return super.onOptionsItemSelected(item);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Constants.RESULT_REFRESH)
{
for (int index = 0, count = getAdapter().getCount(); index < count; index++)
{
if (getAdapter().getItemAt(index) != null)
{
getAdapter().getItemAt(index).onActivityResult(requestCode, resultCode, data);
}
}
// set result for potential activities before
setResult(Constants.RESULT_REFRESH, data);
}
if (requestCode == Constants.REQUEST_SETTINGS)
{
if (resultCode == Constants.RESULT_REFRESH)
{
if (data.hasExtra(Constants.EXTRA_REFRESH_GLOBAL))
{
if (SettingsManager.isGlobalEnabled())
{
leftNavigation.mGlobalButton.setVisibility(View.VISIBLE);
}
else
{
leftNavigation.mGlobalButton.setVisibility(View.GONE);
}
}
if (data.hasExtra(Constants.EXTRA_REFRESH_ANIMATIONS))
{
// TODO: Figgure out how to reset the animations in the view pager
//getAdapter().setAnimation();
}
}
}
}
@Override public boolean onKeyLongPress(int keyCode, KeyEvent event)
{
if (checkMenuKey(keyCode))
{
handledLongPress = true;
startActivity(new Intent(this, SearchActivity.class));
return true;
}
return super.onKeyLongPress(keyCode, event);
}
@Override public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (checkMenuKey(keyCode))
{
event.startTracking();
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* Checks if the menu key has been pressed.
*
* Override this and return false to <b>disable</b> the check
* @param keyCode
* @return
*/
public boolean checkMenuKey(int keyCode)
{
if (keyCode == KeyEvent.KEYCODE_MENU)
{
return true;
}
return false;
}
@Override public void onClick(View v)
{
if (v.getId() == R.id.up_button)
{
finish();
}
}
/**
* @return Gets the base 64 rehashable id of the device
*/
public String getDeviceId()
{
return ((MainApplication)getApplication()).getDeviceId();
}
/**
* Override this to get the activities instances either from the saved instances or bundle extras
* @param instances Bundle extras if saved instances is null, saved instances if not null
*/
public void retrieveArguments(Bundle instances){}
@Override protected void onStart()
{
super.onStart();
if (SettingsManager.isAnalyticsEnabled())
{
EasyTracker.getInstance().activityStart(this);
}
Sensor s = this.sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
this.sensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override protected void onStop()
{
super.onStop();
if (SettingsManager.isAnalyticsEnabled())
{
EasyTracker.getInstance().activityStop(this);
}
Sensor s = this.sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
this.sensorManager.unregisterListener(this, s);
}
@Override public void onAttachedToWindow()
{
super.onAttachedToWindow();
if (adapter != null)
{
adapter.setTopScrollable(getWindow());
}
}
@Override protected void onSaveInstanceState(Bundle outState)
{
outState.putInt("view_pager_index", getViewPager().getCurrentItem());
super.onSaveInstanceState(outState);
}
/**
* Sets the current page
* @param index The index of the page
*/
public void setPage(int index)
{
getViewPager().setCurrentItem(index, true);
}
}